import axios, { type AxiosRequestConfig, type AxiosResponse } from 'axios';
import { ElMessage, ElMessageBox } from 'element-plus';
import { useUserStore } from '@/store/user';
import router from '@/router';

// 创建axios实例
const service = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL || '',
  timeout: 10000
});

// 响应数据类型
export interface ResponseData<T = any> {
  code: number;
  data: T;
  message: string;
}

// 请求拦截器
service.interceptors.request.use(
  (config) => {
    const userStore = useUserStore();
    if (userStore.token) {
      config.headers['Authorization'] = `Bearer ${userStore.token}`;
    }
    return config;
  },
  (error) => {
    console.error('请求错误', error);
    return Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  (response: AxiosResponse<ResponseData>) => {
    const res = response.data;

    // 如果返回的状态码不是200，说明接口请求有误
    if (res.code !== 200) {
      // 50008: 非法的token; 50012: 其他客户端登录; 50014: Token过期;
      if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
        // 重新登录
        ElMessageBox.confirm(
          '登录状态已过期，您可以继续留在该页面，或者重新登录',
          '系统提示',
          {
            confirmButtonText: '重新登录',
            cancelButtonText: '取消',
            type: 'warning'
          }
        ).then(() => {
          const userStore = useUserStore();
          userStore.logout();
          router.push('/login');
        });
      } else {
        ElMessage.error(res.message || '系统错误');
      }
      return Promise.reject(new Error(res.message || '系统错误'));
    } else {
      return res;
    }
  },
  (error) => {
    console.error('响应错误', error);

    if (error.response) {
      const { status } = error.response;

      if (status === 401) {
        // 未授权，跳转到登录页
        ElMessageBox.confirm(
          '登录状态已过期，您可以继续留在该页面，或者重新登录',
          '系统提示',
          {
            confirmButtonText: '重新登录',
            cancelButtonText: '取消',
            type: 'warning'
          }
        ).then(() => {
          const userStore = useUserStore();
          userStore.logout();
          router.push('/login');
        });
      } else if (status === 403) {
        ElMessage.error('没有权限访问该资源');
        router.push('/403');
      } else if (status === 404) {
        ElMessage.error('请求的资源不存在');
        // router.push('/404');
      } else if (status === 500) {
        ElMessage.error('服务器错误，请联系管理员');
      } else {
        ElMessage.error(error.message || '请求失败');
      }
    } else {
      ElMessage.error('网络错误，请检查您的网络连接');
    }

    return Promise.reject(error);
  }
);

// 封装请求方法
const request = <T = any>(config: AxiosRequestConfig): Promise<ResponseData<T>> => {
  return service(config) as unknown as Promise<ResponseData<T>>;
};

export default request;
